// @Author YaoYa
// @Date 2024-10-14 16:54:00
// @Desc
package initialize

import (
	"fmt"
	"github.com/hashicorp/consul/api"
	_ "github.com/mbobakov/grpc-consul-resolver" // It's important
	"go.uber.org/zap"
	"google.golang.org/grpc"
	"mxshop-api/user-web/global"
	"mxshop-api/user-web/proto"
)

// InitSrvConn 使用grpc-consul-resolver初始化连接,进行负载均衡
func InitSrvConn() {
	//consul: //192.168.31.33:8500/user-srv?wait=14s&tag=srv"
	userConn, err := grpc.Dial(
		fmt.Sprintf("consul://%s:%d/%s?wait=14s", global.ServerConfig.ConsulInfo.Host, global.ServerConfig.ConsulInfo.Port, global.ServerConfig.UserSrvInfo.Name),
		grpc.WithInsecure(),
		grpc.WithDefaultServiceConfig(`{"loadBalancingPolicy": "round_robin"}`),
	)

	if err != nil { //为什么服务端没有启动 err还是不为nil
		zap.S().Fatal("[InitSrvConn] 连接 【用户服务】失败",
			"msg", err.Error(),
		)
	}

	//生成grpc的client并调用接口
	global.UserSrvClient = proto.NewUserClient(userConn)

}

// InitSrvConn2 直接传consul获取服务列表,取第一个
func InitSrvConn2() {
	//从注册中心获取到用户服务的信息
	cfg := api.DefaultConfig()
	cfg.Address = fmt.Sprintf("%s:%d", global.ServerConfig.ConsulInfo.Host, global.ServerConfig.ConsulInfo.Port)

	userSrvHost := ""
	userSrvPort := 0
	consulClient, err := api.NewClient(cfg)
	if err != nil {
		panic(err)
	}

	data, err := consulClient.Agent().ServicesWithFilter(fmt.Sprintf(`Service == "%s"`, global.ServerConfig.UserSrvInfo.Name))
	if err != nil {
		panic(err)
	}
	for _, v := range data {
		userSrvHost = v.Address
		userSrvPort = v.Port
		break
	}

	if userSrvHost == "" {
		zap.S().Fatal("[InitSrvConn] 连接 【用户服务】失败")
		return
	}

	//拨号连接用户grpc服务
	conn, err := grpc.Dial(fmt.Sprintf("%s:%d", userSrvHost, userSrvPort), grpc.WithInsecure())
	if err != nil { //为什么服务端没有启动 err还是不为nil
		zap.S().Errorw("[InitSrvConn] 连接 【用户服务】失败",
			"msg", err.Error(),
		)
	}

	//生成grpc的client并调用接口
	global.UserSrvClient = proto.NewUserClient(conn)

	//后续问题？1、用户下线了 2、改端口了 3、改ip了
	//好处 不用每次建立连接进行tcp三次握手
	//一个连接多个groutine公用，性能-连接池

}
